package com.zjl.redis.第02章_十大数据类型;

import com.zjl.redis.第01章_redis安装.RedisUtil;
import redis.clients.jedis.Jedis;

/**
 * redis有序集合(ZSet)
 * zset(sorted set:有序集合)
 * Redis zset和set 一样也是string类型元素的集合,且不允许重复的成员。
 *      不同的是每个元素都会关联一个double类型的分数，
 *      redis正是通过分数来为集合中的成员进行从小到大的排序。
 * zset的成员是唯一的,但分数(score)却可以重复。
 *
 * zset集合是通过哈希表实现的，所以添加，删除，查找的复杂度都是O(1)。
 *      集合中最大的成员数为2^32 - 1
 *
 */
public class B5_ZSet {
    /**
     * zset//与set非常相似   他都关联了一个评分由从第到高方式排序  评分可重复
     *      zadd key score1 value1 score2 value2 //添加元素value并给他一个评分score
     *      zrange key start stop [withscores]//start到stop元素 0是第一个 -1是最后一个 评分从低到高
     *      zrandmember key n [withscores]//查询key  的前 n个 value n默认为1  评分从低到高 相当于 zrange key 0 n-1
     *      @see com.zjl.redis.第12章_大key引出的问题.C_模糊查询的命令 模糊查询指定 key的  value
     *      zrevrange key start stop [withscores]// 评分从高到低     加withscores可以返回评分
     *      zrangbyscore key min max [withscores]//查询key评分在[min, max]的所有value   从小到大
     *      zrevrangbyscore key max min [withscores]//查询key评分在[max,min]的所有value   从大到小
     *      zscore key value//擦看key value的评分
     *      zincrby key increment value//为key的value加评分increment  可以为小数
     *      zrem key value//删除key的value
     *      zremrangebyscore key max min//删除key评分在[max,min]的所有value   从大到小
     *      zcard key//返回key的值的个数
     *      zcount key min max //返回评分[min, max]的个数
     *      zrank key value//返回这个key 的value下标索引位置0开始 0是第一个
     *      zrevrank key value//返回这个key 的value下标索引位置0开始 0是最后一个
     *      zmpop n key//从键名列表中的第一个非空排序集中弹出一个或多个元素，它们是成员分数对
     *      zdiff keynum  key1 key2 ... keyn//差集 返回 keynum 个 key1~keynd的差集 存到新的 newkey
     *          zdiffstore newkey keynum key1 key2 ... keyn//差集 将 keynum 个 key1~keynd的差集 存到新的 newkey
     *      zinter keynum key1 key2 ... keyn//交集 返回 keynum 个 key1~keynd的交集 存到新的 newkey
     *          zinterstore newkey keynum key1 key2 ... keyn//交集 将 keynum 个 key1~keynd的交集 存到新的 newkey
     *      zunion keynum key1 key2 ... keyn//并集 返回 keynum 个 key1~keynd的并集 存到新的 newkey
     *          zunionstore newkey keynum key1 key2 ... keyn//并集 将  keynum 个 key1~keynd的并集 存到新的 newkey
     *      //抖音热搜
     *      有序集合在生活中比较常见,例如根据成绩对学生排名,根据得分对玩家排名等。
     *      对于有序集合的底层实现,可以用数组、平衡树、链表等。数组不便元素的插入、删除;
     *      平衡树或红黑树虽然效率高但结构复杂;链表查询需要遍历所有效率低。
     *      Redis采用的是跳跃表。跳跃表效率堪比红黑树,实现远比红黑树简单。。
     *      里面的评分存的相当于一个链表 有左节点和右节点  存储的位置是乱的
     *          比如  评分存在    1 2 3 4 5 6 7 8 9 10
     *          查找 5 会
     *          第一层会有    1   4   7  10  先判断出 在 4 - 7中
     *          第二层会有         4 5 6 7    在判断出  4 5 6 7 的 5
     *          可以有多层
     *
     * @see com.zjl.redis.第18章_五大数据类型和源码解析.B5_跳表skiplist
     *
     */
    public static void main(String[] args) {

        Jedis jedis = RedisUtil.getRedis();
        System.currentTimeMillis();//获取当前时间戳
        System.out.println(jedis.ping());//查看是否连接成功  PONG:成功
        jedis.close();
    }
}
